package it.greg.findparty.android.ui;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;

import it.greg.findparty.R;
import it.greg.findparty.android.persistence.SettingSaver;
import it.greg.findparty.android.util.GestoreErrori;
import it.greg.findparty.android.util.Localizzatore;
import it.greg.findparty.android.util.SharedObjects;
import it.greg.findparty.model.GestoreEventi;
import it.greg.findparty.util.GestoreDate;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Looper;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements GestoreErrori{

	private ProgressDialog progressDialog;
	private String time;
	private Spinner spinType;
	private Spinner spinData;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		SharedObjects.gestore = new GestoreEventi(this);
		SharedObjects.settingSaver = new SettingSaver(this);
		this.progressDialog = new ProgressDialog(this);
		this.progressDialog.setMessage("Caricamento...");
		this.progressDialog.setCancelable(false);
		//Verifica della connessione internet
		ConnectivityManager connMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
		NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
		if (networkInfo == null || !(networkInfo.isConnected())) {
			Toast.makeText(this, "Connettersi a internet", Toast.LENGTH_SHORT).show();	
		}else{
			writePosition();
		}
		//Generazione delle date da inserire nello Spinner spinDate
		Date start = new Date();
		GestoreDate gestoreDate = new GestoreDate();
		String[] date_array = gestoreDate.getDateRangeAsStrings(start, 30);
		spinData = (Spinner) findViewById(R.id.spinDate);
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, date_array);
		spinData.setAdapter(adapter);
		//Caricamento delle voci dello Spinner spinType e caricamento dell'ultima tipologia di evento scelta
		spinType = (Spinner) findViewById(R.id.spinType);
		String type = SharedObjects.settingSaver.getSettingString("type");
		if (type!=null){
			String[] types;
			types = getResources().getStringArray(R.array.type_array);
			for (int i=0; i<types.length;i++){
				if (type.equals(types[i]))
					spinType.setSelection(i);
			}
		} else {
			/* 
			 * Sfruttando il fatto che non esiste l'ultima tipologia selezionata. Ne deduco
			 * che l'utente stia utilizzando l'app per la prima volta. Quindi
			 * mostro la schermata delle impostazioni.
			 */
			this.onOptionsItemSelected(null); //Richiamo il metodo che mi carica l'activity delle impostazioni
		}
		
	}
	
	/*
	 * Metodo che scrive in txtAddress la posizione corrente
	 * dell'utente.
	 */
	private void writePosition(){
		try{
			Localizzatore l = new Localizzatore();
			TextView txtAddress = (TextView) findViewById(R.id.txtSource);
			String address = l.getPositionString(this); //Ritorna le coordinate
			/*
			 * Con getPositionAddress il programma viene bloccato
			 * poichè viene rilevata una attività di networking nel
			 * thread principale (risolvere delle coordinate in un
			 * indirizzo richiede attività di rete).
			 */
			if (address==null){
				showError("Errore rilevamento posizione");
			}else
				txtAddress.setText(address);
		}catch(Exception e){
			//e.printStackTrace();
			showError("Errore rilevamento posizione:\n"+e.getMessage());
		}
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.settings, menu);
		return true;
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		//Launch the SettingsActivity
		Intent intent = new Intent(this, SettingsActivity.class);
		startActivity(intent);
		return true;
	}
	
	public void btnFind_click(View v) {
		TextView txtSource = (TextView) this.findViewById(R.id.txtSource);
		String sourceAddr = txtSource.getText().toString();
		if ((sourceAddr == null) || (sourceAddr.equals(""))) {
			Toast.makeText(this, "Inserire un indirizzo", Toast.LENGTH_SHORT).show();
		} else {
			String city = SharedObjects.settingSaver.getSettingString("city");
			if (city!=null)
				SharedObjects.gestore.setCitta(city);
			String type = spinType.getSelectedItem().toString();
			SharedObjects.settingSaver.saveSettingString("type", type);
			if (type.equals("Tutte"))
				type="";
			SharedObjects.gestore.setTipo(type);
			progressDialog.show();
			/* Call a thread to get events and pass them to ListViewActivity */
			BackgroundService bs = new BackgroundService();
			bs.setSourceAddr(sourceAddr);
			bs.setContext(this);
			Thread backgroundServiceThread = new Thread(bs);
			backgroundServiceThread.start();
		}
	}
	
	@Override
	public void showError(String message) {
		if (this.progressDialog!=null)
			this.progressDialog.dismiss();
		Intent intent = new Intent(this, ErrorDetailsActivity.class);
		intent.putExtra("errMsg", message);
		startActivity(intent);
	}
	
	
	/** Secondo thread per svolgere le operazioni di networking **/
	public class BackgroundService implements Runnable {

		private String sourceAddr;
		private Context context;
		
		public void setSourceAddr(String addr) {
			this.sourceAddr = addr;
		}
		
		public void setContext(Context c){
			this.context = c;
		}
		
		/*
		 * Metodo per settare l'oggetto gestore a prendere solo gli eventi
		 * che iniziano dall'orario impostato.
		 */
		private void UpdateTime(){
			String localTime = SharedObjects.settingSaver.getSettingString("time");
			if ((time == null)||(!(time.equals(localTime)))) {
				SharedObjects.gestore.setOra(localTime);
				time = localTime;
			}
		}
		
		/*
		 * Aggiorna la data se ne è stata scelta una differente da quella
		 * corrente.
		 */
		private void UpdateDate(){
			Date oggi = new Date();
			GestoreDate gd = new GestoreDate();
			String date = gd.format(oggi);
			String selectedDate = spinData.getSelectedItem().toString();
			if (!(date.equals(selectedDate)))
				SharedObjects.gestore.setData(selectedDate);
		}
		
		@Override
		public void run(){
			try {
				UpdateDate();
				UpdateTime();
				SharedObjects.mapEvents = SharedObjects.gestore.getOrderedEventi(this.sourceAddr);
				ArrayList<String> arrayEventi = SharedObjects.gestore.convertToArrayEvents(SharedObjects.mapEvents);
				progressDialog.dismiss();
				Intent intent = new Intent(this.context, ListViewActivity.class);
				intent.putExtra("arrayEventi", arrayEventi);
				startActivity(intent);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}

}
